package clienteapjava.modelo;

import apjava.basico.ClienteModel;
import apjava.basico.ServidorModel;
import clienteapjava.TratadorConexaoCliente;
import clienteapjava.dados.ConstanteInformacao;
import clienteapjava.dados.GerenciadorMensagemCliente;
import clienteapjava.gui.JanelaPrincipal;
import clienteapjava.transmissao.VideoTransmit;
import java.io.IOException;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.ArrayList;
import java.util.List;

public class PrincipalCliente {
    
    private ServidorModel servidor = new ServidorModel();
    private boolean logado = false;
    private ClienteModel clienteCorrente = new ClienteModel();
    private List clientesLogados;
    private VideoTransmit videoTransmitir;
    private int portaAtualEscutaVideo;
//    private Thread comunicacaoServidor;
    
    private static PrincipalCliente instance;
    
    private PrincipalCliente() {
        try {
            clienteCorrente.setIp(InetAddress.getLocalHost().getHostAddress());
            System.out.println("Ip do cliente: " + clienteCorrente.getIp());
        } catch (UnknownHostException ex) {
            ex.printStackTrace();
        }
    }
    
    public static PrincipalCliente getInstance() {
        if(instance == null) {
            instance = new PrincipalCliente();
        }
        return instance;
    }
    
    public boolean conecta(String ipServidor, int porta) {
        servidor.setIp(ipServidor);
        servidor.setPorta(porta);
        
        try {
            System.out.println("Conectando com o servidor[" + servidor + "]...");
            servidor.setConexao(new Socket(servidor.getIp(), servidor.getPorta()));
            System.out.print("OK! Conectado!");
        } catch (IOException ex) {
            System.out.println("Falha na conexao com o servidor! Erro:" + ex.getMessage());
            ex.printStackTrace();
            return false;
        }
        new Thread(new TratadorConexaoCliente(servidor)).start();
        logado = true;
        return logado;
    }
    
    public void desconecta() {
        logado = !GerenciadorMensagemCliente.enviaMensagem(ConstanteInformacao.DESCONECTAR,
                clienteCorrente,
                servidor);
        if (!logado) {
            this.clientesLogados = new ArrayList<ClienteModel>();
            clienteCorrente.setConexaoCliente(null);
            System.out.println("Cliente deslogado");
        }
        
        if (videoTransmitir!=null) videoTransmitir.stop();
    }
    
    public boolean enviaVideo(){
        String urlStream = "vfw://0";
        System.out.println("enviando video para o servidor: "+ urlStream);
        videoTransmitir = new VideoTransmit(urlStream, clienteCorrente);
        String retorno = videoTransmitir.start();
        boolean OK = (retorno == null);
        if (OK){
            OK = GerenciadorMensagemCliente.enviaMensagem(ConstanteInformacao.AVISO_ENVIO_VIDEO,
                    String.valueOf(clienteCorrente.getPortaEnvioVideo()),
                    servidor);
        }
        return OK;
    }
    
    public boolean isLogado() {
        return logado;
    }
    
    public void setLogado(boolean logado) {
        this.logado = logado;
    }
    
    public List getClientesLogados() {
        return clientesLogados;
    }
    
    public void setClientesLogados(List clientesLogados) {
        this.clientesLogados = clientesLogados;
    }
    
    public ClienteModel getClienteCorrente() {
        return clienteCorrente;
    }
    
    public VideoTransmit getVideoTransmitir() {
        return videoTransmitir;
    }
    
    public void setVideoTransmitir(VideoTransmit videoTransmitir) {
        this.videoTransmitir = videoTransmitir;
    }
    
    public int getPortaAtualEscutaVideo() {
        return portaAtualEscutaVideo;
    }
    
    public void setPortaAtualEscutaVideo(int portaAtualEscutaVideo) {
        this.portaAtualEscutaVideo = portaAtualEscutaVideo;
    }
    
    public ServidorModel getServidor() {
        return servidor;
    }
}
